#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <linux/fb.h>
#include <linux/input.h> // for event_input

int main(int argc, char const *argv[])
{
    // 1. 打开触摸屏文件
    int tp = open("/dev/input/event0", O_RDWR);

    // 2. 定义输入结构体用以存储输入的信息
    struct input_event buf;

    // 3. 不断读取手指滑动轨迹
    int x, y;

    bool xdone = false;
    bool ydone = false;

    // 读取一次输入信息
    // 对于触摸屏而言，每次read到的buf都可能是如下三种数据：
    // 1. 压力值  2. X  3. Y
    while(1)
    {
        read(tp, &buf, sizeof(buf));

        if(buf.type == EV_ABS && buf.code == ABS_X) // 获得了X轴的坐标值
        {
            x = buf.value;
            xdone = true;
        }
        if(buf.type == EV_ABS && buf.code == ABS_Y) // 获得了Y轴的坐标值
        {
            y = buf.value;
            ydone = true;
        }

        if(xdone && ydone)
        {
            // 对触摸屏坐标进行校准，使得他跟LCD尺寸一致
            printf("校准前的坐标:(%d, %d)\n", x, y);
            x = x * 800 / 1024;
            y = y * 480 / 600;
            printf("校准后的坐标:(%d, %d)\n", x, y);

            xdone = false;
            ydone = false;
        }

        if(buf.type == EV_KEY)
        {
            if(buf.code == BTN_TOUCH) // 获得了触摸屏的压力
            {
                if(buf.value > 0)
                    printf("按下\n");
                if(buf.value == 0)
                    printf("松开\n");
            }
        }
    }

    return 0;
}
